home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / admin / xinetd.2 / xinetd / xinetd.2.1.7-linux.4 / libs / src / xlog / slog.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-25  |  3.9 KB  |  206 lines

  1. /*
  2.  * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  3.  * All rights reserved.  The file named COPYRIGHT specifies the terms 
  4.  * and conditions for redistribution.
  5.  */
  6.  
  7. static char RCSid[] = "$Id: slog.c,v 2.2 1993/06/15 18:08:16 panos Exp $" ;
  8.  
  9. #ifndef NO_SYSLOG
  10. #include <syslog.h>
  11. #endif
  12. #include <varargs.h>
  13.  
  14. #include "xlog.h"
  15. #include "impl.h"
  16. #include "slog.h"
  17.  
  18. #define MSGBUFSIZE            2048
  19.  
  20.  
  21. PRIVATE int syslog_init() ;
  22. PRIVATE void syslog_fini() ;
  23. PRIVATE int syslog_control() ;
  24. PRIVATE int syslog_write() ;
  25. PRIVATE int syslog_parms() ;
  26.  
  27. static struct syslog_parms parms =
  28.    {
  29.       0,
  30. #ifndef NO_SYSLOG
  31.       LOG_PID + LOG_NOWAIT,
  32.       LOG_USER,
  33. #else
  34.         0,
  35.         0,
  36. #endif
  37.       "XLOG",
  38.         FALSE
  39.    } ;
  40.  
  41.  
  42. struct xlog_ops __xlog_syslog_ops =
  43.     {
  44.         syslog_init,
  45.         syslog_fini,
  46.         syslog_write,
  47.         syslog_control,
  48.         syslog_parms
  49.     } ;
  50.  
  51. #ifdef NO_SYSLOG
  52.  
  53. /*
  54.  * Notice that the following functions will never be invoked since
  55.  * the xlog_* functions will not call them. However, we need to define
  56.  * them so that we don't have any unresolved references; and we define 
  57.  * them without any arguments.
  58.  */
  59. PRIVATE void syslog()
  60. {
  61. }
  62.  
  63. PRIVATE void openlog()
  64. {
  65. }
  66.  
  67. PRIVATE void closelog()
  68. {
  69. }
  70.  
  71. #else
  72.  
  73. void closelog() ;
  74.  
  75. #endif    /* NO_SYSLOG */
  76.  
  77.  
  78. /*
  79.  * Expected arguments:
  80.  *        facility, level
  81.  */
  82. PRIVATE int syslog_init( xp, ap )
  83.     xlog_s    *xp ;
  84.     va_list    ap ;
  85. {
  86.     register struct syslog_parms    *slp = &parms ;
  87.     struct syslog                        *sp ;
  88.  
  89.     sp = NEW( struct syslog ) ;
  90.     if ( sp == NULL )
  91.         return( XLOG_ENOMEM ) ;
  92.     
  93.     sp->sl_facility = va_arg( ap, int ) ;
  94.     sp->sl_default_level = va_arg( ap, int ) ;
  95.     if ( slp->slp_n_xlogs++ == 0 )
  96.         openlog( slp->slp_ident, slp->slp_logopts, slp->slp_facility ) ;
  97.     xp->xl_data = sp ;
  98.     return( XLOG_ENOERROR ) ;
  99. }
  100.  
  101.  
  102. PRIVATE void syslog_fini( xp )
  103.     xlog_s *xp ;
  104. {
  105.     if ( --parms.slp_n_xlogs == 0 )
  106.         closelog() ;
  107.     FREE( SYSLOG( xp ) ) ;
  108.     xp->xl_data = NULL ;
  109. }
  110.  
  111.  
  112. PRIVATE int syslog_control( xp, cmd, ap )
  113.     xlog_s        *xp ;
  114.     xlog_cmd_e    cmd ;
  115.     va_list        ap ;
  116. {
  117.     switch ( cmd )
  118.     {
  119.         case XLOG_LEVEL:
  120.             SYSLOG( xp )->sl_default_level = va_arg( ap, int ) ;
  121.             break ;
  122.  
  123.         case XLOG_FACILITY:
  124.             SYSLOG( xp )->sl_facility = va_arg( ap, int ) ;
  125.             break ;
  126.         
  127.         case XLOG_PREEXEC:
  128.             closelog() ;
  129.             break ;
  130.  
  131.         case XLOG_POSTEXEC:
  132.             if ( parms.slp_n_xlogs )
  133.                 openlog( parms.slp_ident, parms.slp_logopts, parms.slp_facility ) ;
  134.             break ;
  135.     }
  136.     return( XLOG_ENOERROR ) ;
  137. }
  138.  
  139.  
  140. PRIVATE int syslog_write( xp, buf, len, flags, ap )
  141.     xlog_s    *xp ;
  142.     char        buf[] ;
  143.     int        len ;
  144.     int        flags ;
  145.     va_list    ap ;
  146. {
  147.     int    level ;
  148.     int    syslog_arg ;
  149.     char    prefix[ MSGBUFSIZE ] ;
  150.     int    prefix_size = sizeof( prefix ) ;
  151.     int    prefix_len = 0 ;
  152.     int    cc ;
  153.     char    *percent_m_pos ;
  154.     int    action_flags = ( flags | xp->xl_flags ) ;
  155.  
  156.     if ( flags & XLOG_SET_LEVEL )
  157.         level = va_arg( ap, int ) ;
  158.     else
  159.         level = SYSLOG( xp )->sl_default_level ;
  160.     syslog_arg = SYSLOG( xp )->sl_facility + level ;
  161.  
  162.     if ( action_flags & XLOG_PRINT_ID )
  163.     {
  164.         cc = strx_nprint( &prefix[ prefix_len ], prefix_size, "%s: ",
  165.                             xp->xl_id ) ;
  166.         prefix_len += cc ;
  167.         prefix_size -= cc ;
  168.     }
  169.  
  170.     if ( ( action_flags & XLOG_NO_ERRNO ) ||
  171.                         ( percent_m_pos = __xlog_add_errno( buf, len ) ) == NULL )
  172.         syslog( syslog_arg, "%.*s%.*s", prefix_len, prefix, len, buf ) ;
  173.     else
  174.     {
  175.         int cc_before_errno = percent_m_pos - buf ;
  176.         int cc_after_errno = len - cc_before_errno - 2 ;
  177.         char *ep ;
  178.         char errno_buf[ 100 ] ;
  179.         unsigned size = sizeof( errno_buf ) ;
  180.         
  181.         ep = __xlog_explain_errno( errno_buf, &size ) ;
  182.         syslog( syslog_arg, "%.*s%.*s%.*s%.*s",
  183.                 prefix_len, prefix,
  184.                     cc_before_errno, buf,
  185.                         (int)size, ep,
  186.                             cc_after_errno, &percent_m_pos[ 2 ] ) ;
  187.     }
  188.     return( XLOG_ENOERROR ) ;
  189. }
  190.  
  191.  
  192. PRIVATE int syslog_parms( ap )
  193.     va_list ap ;
  194. {
  195.     char *__xlog_new_string() ;
  196.     char *id = __xlog_new_string( va_arg( ap, char * ) ) ;
  197.  
  198.     if ( id == NULL )
  199.         return( XLOG_ENOMEM ) ;
  200.     parms.slp_ident = id ;
  201.     parms.slp_logopts = va_arg( ap, int ) ;
  202.     parms.slp_facility = va_arg( ap, int ) ;
  203.     return( XLOG_ENOERROR ) ;
  204. }
  205.  
  206.